from decimal import Decimal
from django.shortcuts import render

# Create your views here.
from django_redis import get_redis_connection
from rest_framework.generics import CreateAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

from goods.models import SKU
from orders import serializers


class OrderInfoView(APIView):
    """订单页面展示
    1.接收参数? 返回的用户地址 购物车商品数据  可以通过user查询 不需要传递额外参数
    2.返回数据:  运费 结算的商品列表  id,price,count,image 数量
    3.序列化返回{
        freight:10,
        skus:[{id,price,..},{id,..}]
    }
    """
    # 必须是登录的用户才能访问订单页面
    permission_classes = [IsAuthenticated]

    def get(self, request):
        # 获取当前用户
        user = request.user
        # 从redis中查询购物车数据
        redis_conn = get_redis_connection('cart')
        # 查询hash中的商品信息  {15:1,16:2}
        redis_cart = redis_conn.hgetall('carts_%s' % user.id)
        # 查询set中的勾选商品数据
        redis_selected = redis_conn.smembers('cart_selected_%s' % user.id)
        # 创建字典用以保存勾选的商品的信息
        cart = {}
        for sku_id in redis_selected:
            # cart[16]=1
            cart[int(sku_id)] = int(redis_cart[sku_id])
        # 遍历完成之后 cart中的商品数据就是要提交到订单页面的数据
        # 从数据库中查询商品列表数据
        skus = SKU.objects.filter(id__in=cart.keys())
        # 附上count属性
        for sku in skus:
            sku.count = cart[sku.id]
        # 运费
        freight = Decimal('10.00')

        # 序列化两种方式
        # sl=sl(skus,many=True)
        # return resp({"freight":fr,'skus':sl.data})
        serializer = serializers.OrderSettleSerializer({'freight': freight, 'skus': skus})
        return Response(serializer.data)


class SaveOrderView(CreateAPIView):
    """保存订单
    1.获取参数address   pay_method
    2.校验数据(地址是否在用户地址表中 支付方式是否支持) 可以交给序列化器进行
    3.保存到订单表 获取用户  从redis中查询选中商品信息  创建订单obj  对于选中的商品列表  进行遍历  查询数据库库存 判断
        保存到订单表  如果有一种商品库存不足 则撤销之前的所有操作(django事务) 每往订单商品表中添加一条数据 将对应的数量count+到订单表
        库存-count  sales+count  订单记录更新
    4.遍历完成之后说明订单商品都已保存  删除redis购物车中勾选的数据
    5.返回订单id
    """
    permission_classes = [IsAuthenticated]
    serializer_class = serializers.SaveOrderSerializer
